import axios from "axios";

class ZYRequest {
  constructor(config) {
    this.instance = axios.create(config);
    this.interceptors = config.interceptors;
    // 控制发送请求时的加载动画 默认开启
    this.showLoading = config.showLoading ?? true;

    this.instance.interceptors.request.use(
      this.interceptors?.requestInterceptor,
      this.interceptors?.requestInterceptorCatch
    );
    this.instance.interceptors.response.use(
      this.interceptors?.responseInterceptor,
      this.interceptors?.responseInterceptorCatch
    );

    /**
     * 添加所有实例都有的拦截器
     */
    this.instance.interceptors.request.use(
      (config) => {
        // console.log('所有实例拦截器：请求拦截成功')
        if (this.showLoading) {
          // 请求加载动画
        }
        return config;
      },
      (err) => {
        // console.log('所有实例拦截器：请求拦截失败')
        return err;
      }
    );
    // 所有接口的 响应拦截器
    this.instance.interceptors.response.use(
      (res) => {
        // 拿到响应就把loding关掉
        // this.loading?.close();
        const { data } = res;
        // 状态码仍为2xx的错误响应拦截
        // 业务性的请求失败
        if (data.returnCode === "-1001") {
          // console.log('请求失败')
        } else {
          // console.log('所有实例拦截器：响应拦截成功')
          return data;
        }
      },
      (err) => {
        // 拿到响应就把loding关掉
        // this.loading?.close();
        // 一般这里可通过服务器返回的错误码 判断错误
        // 网络请求失败
        switch (err.response.status) {
          case 404:
            console.log("404");
            break;
        }
        // console.log('所有实例拦截器：响应拦截失败')
        return err;
      }
    );
  }

  request(config) {
    return new Promise((resolve, reject) => {
      // if (config.interceptors?.requestInterceptor) {
      //   config = config.interceptors.requestInterceptor(config);
      // }
      // 关闭发送请求时的加载动画
      if (config.showLoading === false) {
        this.showLoading = config.showLoading;
      }
      // 调用axios实例上的 request方法
      this.instance
        .request(config)
        .then((res) => {
          // 1、请求单个数据的处理
          // 如果当前请求有响应拦截器就执行一下
          if (config.interceptors?.responseInterceptor) {
            res = config.interceptors.responseInterceptor(res);
          }
          // 2、将showloading设置为true不会影响下一次请求
          this.showLoading = true;
          // 3、将数据返回
          resolve(res);
        })
        .catch((err) => {
          this.showLoading = true;
          reject(err);
        });
    });
  }

  get(config) {
    return this.request({ ...config, method: "GET" });
  }
  post(config) {
    return this.request({ ...config, method: "post" });
  }
  put(config) {
    return this.request({ ...config, method: "put" });
  }
  delete(config) {
    return this.request({ ...config, method: "delete" });
  }
}

export default ZYRequest;
